package com.hspedu.houserent.service;

import com.hspedu.houserent.domain.House;
import com.hspedu.houserent.utils.Utility;

/**
 * @Author Stringzhua
 * @Date 2024/3/4 16:09
 * description:
 * 定义House[]保存信息
 * 1.响应对HouseView的调用
 * 2.完成对房屋信息的crud
 */
public class HouseService {
    private House[] houses;//保存House对象
    private int houseNums = 1;//记录当前有多少个房屋信息
    private int idCounter = 1;//记录当前的id自增长到哪个值了 counter-->计数器

    //1.数据由HouseSevice的list()返回所有的房屋houses信息
    public House[] list() {
        return houses;
    }

    //2.编写方法add(House new House),把新的house对象加入到houses数组 返回boolean
    //数组扩容方法
    public void arrAdd() {
        House newHouse1[] = new House[houses.length + 1];
        for (int i = 0; i < houses.length; i++) {
            newHouse1[i] = houses[i];
        }
        houses = newHouse1;
    }

    public boolean add(House newHouse) {
        //数组扩容版本-->推荐
        //判断是否还可以继续添加(我们暂时不考虑数组扩容的问题)-->能否自己添加数组扩容机制
        //判断是否还可以继续添加，因为数组长度是有限的(我们暂时不考虑数组扩容的问题)
        // 因此，自然的就知道要创建一个变量，来记录当前有多少个房屋信息
        if (houseNums == houses.length) {//已满，不能再添加了
            System.out.println("数组已满，不能再添加了...");
            System.out.println("是否选择新加一个房屋位置 y/n");
            boolean key1 = true;
            while (key1) {
                char choice = Utility.readChar();
                if (choice == 'y') {
                    //这里调用 数组扩容方法
                    arrAdd();
                    break;
                } else if (choice == 'n') {
                    return false;
                } else {
                    System.out.println("输入有误，只能输入y或n");
                }
            }
        }
        //把newHouse对象加入到数组的最后
        houses[houseNums] = newHouse;//因为jack起始位置为houses[0]
        // ,而houseNums初始为1，所以刚好相差一位，后面的添加也会跟着相差一位，
        // 就变相将newHouse对象添加到数组的最后
        //注意：这newHouse是对象的引用，是一个地址。
        houseNums++;//这里++是因为新添了一个房屋信息，要向后移动
        //houses[houseNums++]=newHouse;//也可以将上面两步合起来
        // 先赋值后自增

        //我们需要设计一个id自增长的机制，然后更新newHouse的id
        idCounter++;
        newHouse.setId(idCounter);
        //newHouse.setId(++idCounter);// 这里也可以把上面两步合起来
        return true;

        //老师写的版本-->数组未扩容
//        if (houseNums == houses.length) {//不能再添加了
//            System.out.println("数组已满,不能再添加了......");
//            return false;
//        }
//        //把newHouse对象加入到House[]数组后面
//        houses[houseNums++] = newHouse;
////        houseNums++;//新增加了一个
//        //需要设计一个id自增长的机制,然后更新newHouse的id
////        idCounter++;
//        newHouse.setId(++idCounter);
//        return true;
    }

    //    3.编写del(int delId)方法,完成真正的删除任务,返回一个Boolean
    public boolean del(int delId) {
        //应该先找到要删除的房屋信息对应的下标
        //下标和房屋的编号不是一回事
        int index = -1;
        for (int i = 0; i < houseNums; i++) {
            if (delId == houses[i].getId()) {//要删除的房屋对应的id,是数组下标为i的元素
                index = i;//这里使用index记录i
            }
        }
        if (index == -1) {//说明delId()在数组中不存在
            return false;
        }
        //如果找到,后一个数组往前移,index+1
        for (int i = 0; i < houseNums - 1; i++) {
            houses[i] = houses[i + 1];
        }
//        houses[houseNums - 1] = null;
//        houseNums--;//少一个

        //空指针异常原因--houseNums-1-->--houseNums
        houses[--houseNums] = null;//将当前存在的房屋信息的最后一个置空null
        return true;
    }

    //编写findById(int findId),返回false,如果没有返回null
    public House findById(int findId) {
        //遍历数组
        for (int i = 0; i < houseNums; i++) {
            if(findId==houses[i].getId()){
                return houses[i];
            }
        }
        return null;
    }

    //构造器
    public HouseService(int size) {
        //new houses
        houses = new House[size]; //在构造器中去指定数组的大小
        //当创建HouseService对象,指定数组大小
        //为了配合测试信息,直接先初始化一个数组
        houses[0] = new House(1, "jack", "112", "海淀区", 2000, "未出租");
    }

}
